/**
 * 观察者模式 (Observer Pattern)
 * 主题类，维护观察者列表并通知观察者
 */
class Subject {
  /**
   * 构造函数
   * 初始化观察者列表
   */
  constructor() {
    // TODO: 初始化观察者列表
    // 提示：使用数组存储观察者
  }

  /**
   * 添加观察者
   * @param {Observer} observer - 要添加的观察者对象
   */
  addObserver(observer) {
    // TODO: 实现添加观察者功能
    // 提示：将观察者添加到观察者列表中
  }

  /**
   * 移除观察者
   * @param {Observer} observer - 要移除的观察者对象
   */
  removeObserver(observer) {
    // TODO: 实现移除观察者功能
    // 提示：从观察者列表中移除指定的观察者
  }

  /**
   * 通知所有观察者
   * @param {any} data - 要传递给观察者的数据
   */
  notify(data) {
    // TODO: 实现通知所有观察者功能
    // 提示：遍历所有观察者并调用其update方法
  }

  /**
   * 获取观察者数量
   * @returns {number} 当前观察者数量
   */
  getObserverCount() {
    // TODO: 返回观察者数量
  }
}

/**
 * 观察者接口
 * 定义观察者的基本结构
 */
class Observer {
  /**
   * 构造函数
   * @param {string} name - 观察者名称
   */
  constructor(name) {
    this.name = name
  }

  /**
   * 更新方法
   * @param {any} data - 从主题接收的数据
   */
  update(data) {
    // TODO: 实现更新方法
    // 提示：接收主题通知并处理数据
  }
}

/**
 * 具体观察者实现
 * 继承自Observer，实现具体的观察者逻辑
 */
class ConcreteObserver extends Observer {
  /**
   * 构造函数
   * @param {string} name - 观察者名称
   */
  constructor(name) {
    super(name)
    this.receivedData = null
  }

  /**
   * 更新方法实现
   * @param {any} data - 从主题接收的数据
   */
  update(data) {
    // TODO: 实现具体观察者的更新逻辑
    // 提示：保存接收到的数据
  }

  /**
   * 获取接收到的数据
   * @returns {any} 接收到的数据
   */
  getReceivedData() {
    // TODO: 返回接收到的数据
  }
}

module.exports = { Subject, Observer, ConcreteObserver }
